iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
0

Persistent Volume

K8s 用戶需要很了解所用到的網路儲存系統的配置細節才能完成Volume配置, 由於要研究的配置很多, 所以K8s設計了Persistent Volume來將儲存系統和管理解耦, 它是位於用戶和管理員之間的抽象層。
Persistent Volume(PV)是由管理員配置在儲存系統上的一段儲存空間, 它將共享儲存數據做為一種可由用戶申請使用的資源, 實現“儲存消費”的機制, 用戶要對PersistentVolumeClaim(PVC)提出申請使用PV的請求, PVC會向PV申請特定大小的空間和訪問模式再創建出PVC Volume, 最後再由Pod 通過PVC做關聯。

https://ithelp.ithome.com.tw/upload/images/20200925/20129656A2Bxjs91E0.png

創建PV

  • spec字段:

    1. Capacity: PV容量
    2. 訪問模式:
    • ReadWriteOnce: 簡寫RWO, 僅可被單一節點讀寫掛載
    • ReadOnlyMany: 簡寫ROX, 可被多個節點同時讀取掛載,只能讀不能寫
    • ReadWriteMany: 簡寫RWX, 可被多個節點同時讀寫掛載
    1. persistentVolumeReclaimPolicy: PV被釋放的處理機制, 可用選項 Retain, Recycle, Delete, 預設Retain
    • Retain: 保持不動, 由管理員手動回收
    • Recycle: 刪除Volume底下所有文件, 目前只有NFS, hostPath支援
    • Delete: 刪除Volume, 目前只有雲端儲存系統可以使用
    1. volumeMode: 指定volume可被當作文件系統使用或只能使用原本的區塊設備, 預設Filesystem
    2. storageClassName: volume所屬的StorageClass名稱, 預設, 不屬於任何StorageClass。
    3. mountOptions: 掛載選項組成的列表, 例如: ro, soft, hard。

    各類型PV支持的訪問模式可參考官網

  • YAML 部署

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-nfs-001
      lables:
        release: stable
    spec:
      capacity:
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistenVolumeRecliamPolicy: Recycle
      storageClassName: slow
      mountOptions:
      - hard
      - nfsvers=4.1
      nfs:
        path: "/webdata/htdocs"
        server: nfs.ilinux.io
    
  • 查看結果

    -> % kubectl get pv pv-nfs-001
    NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    pv-nfs-001   5Gi        RWX            Retain           Available           slow
    
    • STATUS會有幾種結果:
      • Available: 可用狀態的自由資源, 尚未被PVC綁定
      • Bound: 已經綁定到某個PVC
      • Released: 綁定的PVC已被刪除, 但資源尚未被回收
      • Failed: 自動回收資源失敗而處於故障狀態

創建PVC

PVC和PV是一對一的關係, 它透過用戶申請要佔用某個PV而創建

  • spec字段包含:

    • accessMode: PVC的訪問模式, 可用模式同PV
    • resources: volume需要的最小資源設定
    • selector: 綁定PV要使用的標籤選擇器(matchLabels)或正則式(matchExpressions)
    • storageClassName: 所屬的StorageClass名稱
    • volumeMode: 指定volume可被當作文件系統使用或只能使用原本的區塊設備, 預設Filesystem
    • volumeName: 指定要綁定的PV名稱
  • YAML 部署

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: pvc-nfs-001
        labels:
          release: stable
      spec:
        accessModes:
        - ReadWriteMany
        volumeMode: Filesystem
        resources:
          requests:
            storage: 5Gi
        storageClassName: slow
        selector:
          matchLabels:
            release: stable
    
  • 查看結果

    -> % kubectl get pvc
    NAME          STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc-nfs-001   Pending                                      slow           72s
    

綁定PVC之後, Pod就可以使用到PV的數據, Pod引用PVC時只能使用同一個Namespace的資源。

  • 在Pod中使用PVC
    pod spec 加上兩個字段即可使用PVC
    1.claimName: 要調用的PVC名稱
    2.readOnly: 是否將volume強制掛載成唯讀模式, 預設false

    YAML範例

      apiVersion: v1
      kind: Pod
      metadata:
        name: pod-nfs
      spec:
        containers:
        - name: redis
          image: redis:4-apline
          ports:
          - containerPort: 6379
          volumeMounts:
          - mountPath: /data
            name: redis-1
        volumes:
        - name: redis-1
          persistentVolumeClaim:
            claimName: pv-nfs-001
    

StorageClass

StorageClass 是為了讓管理員方便管理PV和PVC所創建出來的類別, 管理員可按照性能高低分類或是根據備份策略分類。StorageClass可以支援PV動態創建,提高PV運用的靈活性。

https://ithelp.ithome.com.tw/upload/images/20200925/20129656TAqVDCbAqu.png

  • 創建 StorageClass
    StorageClass的name是調用的識別符, 為必填metadate.name
    spec 字段包含:
    • provisioner: 提供儲存資源的系統, 用在將儲存插件調用到目標儲存系統, k8s內建的都以kubernetes.io為前綴, 也開放用戶依據規範自行定義
    • parameters: 描述要關聯的Volume的參數
    • reclaimPolicy: 指定動態創建的PV回收策略, 可用Delete和Retain, 預設Retain
    • volumeBindingMode: 定義如何為PVC完成供給與綁定, 預設VolumeBindingImmediate; 此設定只在啟用Volume調度功能才生效
    • mountOptions: 動態創建的PV掛載選項列表

PV & PVC 生命週期

  1. Provisioning:
    Provisioning 是指為PVC準備可用的PV的機制。K8s提供兩個機制:靜態供給和動態供給。

    • 靜態供給: 管理員手動創建
    • 動態供給: StorageClass 輔助動態創建
  2. Binding:
    用戶定義好PVC之後, k8s會為其查找匹配的PV建立兩邊的關聯, 再把兩邊的狀態調整為"Binding"。如果PVC一直無法找到匹配的PV, 則狀態會是"unbound"

  3. Reclaiming
    Volume完成任務後即可刪除PVC回收資源, 回收策略取決於PV的定義:"Retained", "Recycled" ,"Deleted"。

  4. Resizing
    安裝好PersistentVolumeClaimResize插件之後才能使用PVC擴展機制, 在支援擴展PVC的Volume部署spec時將allowVolumeExpansion設置為true 即可動態擴展Volume空間

今日小結

今天先到這裡了, 明天會來讀常用的ConfigMap 和 Secret, 他們也是Volume的一種!


上一篇
day 17 Volume(1) - 支援類型
下一篇
day 19 ConfigMap and Secret
系列文
K8S - 30天從擦槍到提槍上陣學習筆記。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
kivenkao
iT邦新手 5 級 ‧ 2021-05-14 15:54:14

請問有試過用StorageClass 自動創建PV嗎
謝謝

我要留言

立即登入留言